﻿#region Using

using System;
using System.Diagnostics;
using SAPbouiCOM;
using SapFramework.Interface.Controls.Items.Base;
using SapFramework.Interface.Events;

using Form = SapFramework.Interface.Controls.Forms.Base.Form;
using Item = SapFramework.Interface.Controls.Items.Base.Item;

#endregion

namespace SapFramework.Interface.Controls.Items.Specific
{
    /// <summary>
    /// Realiza o encapsulamento de um objeto do tipo <see cref="SAPbouiCOM.ButtonCombo"/> da UI API do SAP Business One
    /// </summary>
    public sealed class ButtonCombo : Item, SAPbouiCOM.ButtonCombo
    {
        #region Eventos

        /// <summary>
        /// Evento disparado quando o botão principal do mouse foi clicado duas vezes sobre um item, mas nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_DOUBLE_CLICK )]
        public event EventBoolItem OnBeforeDoubleClick;

        /// <summary>
        /// Evento disparado quando o botão principal do mouse foi clicado duas vezes sobre um item, e qualquer ação do SBO já foi realizada.
        /// </summary>
        [Event( BoEventTypes.et_DOUBLE_CLICK )]
        public event EventVoidItem OnAfterDoubleClick;

        /// <summary>
        /// Evento disparado quando o botão do mouse foi liberado em cima de um item, ou seja, quando o botão do mouse está em cima, mas nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_ITEM_PRESSED )]
        public event EventBoolItem OnBeforeItemPressed;

        /// <summary>
        /// Evento disparado quando o botão do mouse foi liberado em cima de um item, ou seja, quando o botão do mouse está em cima, e qualquer ação do SBO já foi realizada.
        /// </summary>
        [Event( BoEventTypes.et_ITEM_PRESSED )]
        public event EventVoidItem OnAfterItemPressed;

        /// <summary>
        /// Ocorre quando um item na ComboBox foi selecionado, porém nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_COMBO_SELECT )]
        public event EventBoolItem OnBeforeComboSelect;

        /// <summary>
        /// Ocorre quando um item na ComboBox foi selecionado, e qualquer ação do SBO já foi executada.
        /// </summary>
        [Event( BoEventTypes.et_COMBO_SELECT )]
        public event EventVoidItem OnAfterComboSelect;

        /// <summary>
        /// Evento que ocorre quando um botão de ChooseFromList foi clicado, mas ela ainda não foi invocada.
        /// </summary>
        [Event( BoEventTypes.et_CHOOSE_FROM_LIST )]
        public event EventBoolChooseFromList OnBeforeChooseFromList;

        /// <summary>
        /// Evento que ocorre quando um botão de ChooseFromList foi clicado, e ela já está a mostra.
        /// </summary>
        [Event( BoEventTypes.et_CHOOSE_FROM_LIST )]
        public event EventVoidChooseFromList OnAfterChooseFromList;

        /// <summary>
        /// Disparado antes da exibição do menu que ocorre quando um clique com o botão direito do mouse é feito sobre um item.
        /// </summary>
        [Event( BoEventTypes.et_RIGHT_CLICK )]
        public event EventBoolContextMenu OnBeforeRightClick;

        /// <summary>
        /// Disparado após a exibição do menu que ocorre quando um clique com o botão direito do mouse é feito sobre um item.
        /// </summary>
        [Event( BoEventTypes.et_RIGHT_CLICK )]
        public event EventVoidContextMenu OnAfterRightClick;

        #endregion

        /// <summary>
        /// Guarda uma referencia para a parte específica do item
        /// </summary>
        private readonly  SAPbouiCOM.ButtonCombo mButtonCombo;

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="aForm">O formulário ao qual o item pertence</param>
        /// <param name="aItemUniqueId">Id único do Item do Form do SAP Business One</param>
        public ButtonCombo( Form aForm, string aItemUniqueId ) : base( aForm, aItemUniqueId, BoFormItemTypes.it_BUTTON_COMBO )
        {
            mButtonCombo = mItem.Specific as  SAPbouiCOM.ButtonCombo;
        }

        #region Implementation of IButtonCombo

        /// <summary>
        /// Simula uma seleção do usuário na ComboBox do botão.
        /// </summary>
        /// <remarks>
        /// Caso um dos modos de seleção falhe, (exemplo, por índice), os demais métodos de busca também serão realizados.
        /// </remarks>
        /// <param name="aIndex">
        /// Valor a ser selecionado. Seleciona o valor com base em um dos seguintes fatores:
        /// <list type="bullet">
        /// <item>O índice do <see cref="ValidValue"/>, iniciado de 0 (int).</item>
        /// <item>O valor a ser selecionado, ou sua descrição (string).</item>
        /// </list>
        /// </param>
        /// <param name="aSearchKey">Método de busca</param>
        /// <see cref="SelectExclusive"/>
        public void Select( object aIndex, BoSearchKey aSearchKey = BoSearchKey.psk_ByValue )
        {
            Debug.Assert( aIndex.GetType() == typeof (int) || aIndex.GetType() == typeof (string) );
            mButtonCombo.Select( aIndex, aSearchKey );
        }

        /// <summary>
        /// Simula uma seleção do usuário na ComboBox do botão.
        /// </summary>
        /// <remarks>
        /// Diferente do método <see cref="Select"/>, este não irá buscar pelos outros métodos de busca. Ao invés, lançará uma exceção.
        /// </remarks>
        /// <param name="aIndex">
        /// Valor a ser selecionado. Seleciona o valor com base em um dos seguintes fatores:
        /// <list type="bullet">
        /// <item>O índice do <see cref="ValidValue"/>, iniciado de 0 (int).</item>
        /// <item>O valor a ser selecionado, ou sua descrição (string).</item>
        /// </list>
        /// </param>
        /// <param name="aSearchKey">Método de busca</param>
        /// <exception cref="Exception">Quando não encontrar nenhum registro</exception>
        public void SelectExclusive( object aIndex, BoSearchKey aSearchKey )
        {
            Debug.Assert( aIndex.GetType() == typeof (int) || aIndex.GetType() == typeof (string) );
            mButtonCombo.SelectExclusive( aIndex, aSearchKey );
        }

        /// <summary>
        /// Retorna uma referência para o objeto de <see cref="ValidValues"/> da ComboBox do botão.
        /// </summary>
        public ValidValues ValidValues
        {
            get { return mButtonCombo.ValidValues; }
        }

        /// <summary>
        /// Retorna uma referência para o objeto <see cref="ValidValue"/> que se encontra selecioando na ComboBox do botão.
        /// </summary>
        /// <remarks>
        /// Será nulo quando nenhum item estiver selecionado.
        /// </remarks>
        public ValidValue Selected
        {
            get { return mButtonCombo.Selected; }
        }

        /// <summary>
        /// Referência para o objeto <see cref="DataBind"/>, que realiza uma ligação com um:
        /// <list type="bullet">
        /// <see cref="UserDataSource"/>
        /// <see cref="DBDataSource"/>
        /// <see cref="DataTable"/>
        /// </list>
        /// </summary>
        /// <see cref="DataBind"/>
        public DataBind DataBind
        {
            get { return mButtonCombo.DataBind; }
        }

        /// <summary>
        /// O texto do botão principal.
        /// 
        /// Utilize esta propriedade para setar o texto quando nenhum <see cref="ValidValue"/> for especificado; o item então agirá como um botão.
        /// </summary>
        /// <remarks>
        /// Pode ser setado apenas quando não estiver ligado a um DataSource.
        /// </remarks>
        public string Caption
        {
            get { return mButtonCombo.Caption; }
            set { mButtonCombo.Caption = value; }
        }

#if !Debug881 && !Release881
        /// <summary>
        /// Texto que será mostrado pelas opções da combo quando o botão for expandido.
        /// </summary>
        public BoExpandType ExpandType
        {
            get { return mButtonCombo.ExpandType; }
            set { mButtonCombo.ExpandType = value; }
        }
#endif
        #endregion
    }

}